Session lead: Katie Smith (Centre for Ecology & Hydrology) k.a.smith@ceh.ac.uk (01491 692209)

This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

This session will show you the basic concepts of plotting using the interactive package dygraphs.

You may need to set your working directory:

setwd("Z:/repos/katsmi/Stats_R_Visualisation/")

load in packages

install.packages("dygraphs")
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.3/dygraphs_1.1.1.4.zip'
Content type 'application/zip' length 361196 bytes (352 KB)
downloaded 352 KB
package ‘dygraphs’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
    C:\Users\katsmi\AppData\Local\Temp\RtmpULYgNu\downloaded_packages
library(dygraphs)
package <U+393C><U+3E31>dygraphs<U+393C><U+3E32> was built under R version 3.3.3
install.packages("xts")
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.3/xts_0.10-1.zip'
Content type 'application/zip' length 738123 bytes (720 KB)
downloaded 720 KB
package ‘xts’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
    C:\Users\katsmi\AppData\Local\Temp\RtmpULYgNu\downloaded_packages
library(xts)
package <U+393C><U+3E31>xts<U+393C><U+3E32> was built under R version 3.3.3Loading required package: zoo

Attaching package: <U+393C><U+3E31>zoo<U+393C><U+3E32>

The following objects are masked from <U+393C><U+3E31>package:base<U+393C><U+3E32>:

    as.Date, as.Date.numeric


Attaching package: <U+393C><U+3E31>xts<U+393C><U+3E32>

The following object is masked from <U+393C><U+3E31>package:leaflet<U+393C><U+3E32>:

    addLegend
install.packages("dplyr")
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.3/dplyr_0.7.4.zip'
Content type 'application/zip' length 2897358 bytes (2.8 MB)
downloaded 2.8 MB
package ‘dplyr’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
    C:\Users\katsmi\AppData\Local\Temp\RtmpULYgNu\downloaded_packages
library(dplyr)
package <U+393C><U+3E31>dplyr<U+393C><U+3E32> was built under R version 3.3.3
Attaching package: <U+393C><U+3E31>dplyr<U+393C><U+3E32>

The following objects are masked from <U+393C><U+3E31>package:xts<U+393C><U+3E32>:

    first, last

The following objects are masked from <U+393C><U+3E31>package:stats<U+393C><U+3E32>:

    filter, lag

The following objects are masked from <U+393C><U+3E31>package:base<U+393C><U+3E32>:

    intersect, setdiff, setequal, union

read in some flow data

Thames_Obs<-read.csv("Qobs_39001.csv")

prep the data for dygraphs

# format date column
Thames_Obs$DATE<- as.POSIXct(Thames_Obs$DATE, format="%d/%m/%Y")
# convert to xts format (crucial  step!)
Thames_Obs_xts<-as.xts(Thames_Obs, order.by=Thames_Obs$DATE)

plot a dygraph

dygraph(Thames_Obs_xts)%>%
  dyOptions()%>%
  dyRangeSelector()

plot observed streamflow with the precipitation data, with different y axes

# read in precipitation data
Thames_precip <- read.csv("MO_daily_rain_1891_2015_39001.csv")
Thames_precip$DATE<-as.POSIXct(Thames_precip$DATE, format="%Y-%m-%d")
# merge the data
Thames_data<-full_join(Thames_Obs,Thames_precip,by="DATE")
#  convert the observed discharge to runoff (so its in the same units as the precip)
# divide by catchment area (m2) and mulitply by 86.4
Thames_data$Runoff <- (Thames_data$Qobs/9948.0)*86.4
# convert to xts - note that I am leaving out the Date column from the xts dataset. When given multiple series it often likes to plot the date column too which is a pain!
Thames_data_xts <- as.xts(Thames_data[,3:4], order.by=Thames_data$DATE)
# initiate the dygraph
dygraph(Thames_data_xts, main = "Runoff and Precipitation Observations for the Thames at Kingston")%>%
# define the first axis  
dyAxis(name = "y", label = "runoff (mm/day)",
       valueRange = range(Thames_data_xts[, "Runoff"],
                          na.rm = TRUE)* c(0.01, 1.59))%>%
# define the second axis
dyAxis(name = "y2", label = "precip (mm/day)",
                   valueRange = rev(range(Thames_data_xts[, "Mean_rainfall"], 
                   na.rm = TRUE)* c(0.01, 2.99)))%>%
# plot the data
dySeries("Runoff",axis = 'y')%>%
dySeries("Mean_rainfall", axis = 'y2', stepPlot = TRUE,
         fillGraph = TRUE)%>%
dyOptions(colors = RColorBrewer::brewer.pal(3,"Set1")[3:1]) %>%
dyRangeSelector()

plot an upper and lower limit on a series

#read in some modelled data
Thames_Qsim <- read.csv("HD_Reconstruction_39001.csv")
Thames_Qsim$Date<-as.POSIXct(Thames_Qsim$Date,format="%Y-%m-%d")
#reorder so the lower, middle and upper columns are correctly placed
Thames_Qsim<-Thames_Qsim[,c(2,4,3,5)]
Thames_Qsim_xts<-as.xts(Thames_Qsim[,2:4],order.by=Thames_Qsim$Date)
dygraph(Thames_Qsim_xts, main=paste0("Reconstucted Flow Time Series for the Thames at Kingston")) %>%
  dySeries(c("Min_500","Flow_Top_Calib","Max_500"))%>%
  dyAxis("y", label = "Flow (m3/s)")%>%
  dyOptions(fillAlpha=0.5) %>%
  dyRangeSelector(height=10)

plot the observations too for comparison

colnames(Thames_Qsim)<-c("DATE","Min_500","Flow_Top_Calib","Max_500")
Thames_comp<-full_join(Thames_Qsim,Thames_Obs,by="DATE")
Thames_comp_xts<-as.xts(Thames_comp[,2:5],order.by=Thames_comp$DATE)
dygraph(Thames_comp_xts, main=paste0("Reconstucted and Observed Flow Time Series for the Thames at Kingston")) %>%
  dySeries(c("Min_500","Flow_Top_Calib","Max_500"))%>%
  dySeries("Qobs")%>%
  dyAxis("y", label = "Flow (m3/s)")%>%
  dyOptions(fillAlpha=0.5) %>%
  dyRangeSelector(height=10)
LS0tDQp0aXRsZTogIlN0YXRzIGFuZCBSIFZpc3VhbGlzYXRpb24gTm90ZWJvb2sgLSBEeWdyYXBocyINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdA0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQotLS0NClNlc3Npb24gbGVhZDogS2F0aWUgU21pdGggKENlbnRyZSBmb3IgRWNvbG9neSAmIEh5ZHJvbG9neSkgay5hLnNtaXRoQGNlaC5hYy51ayAoMDE0OTEgNjkyMjA5KQ0KDQpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLiANCg0KVGhpcyBzZXNzaW9uIHdpbGwgc2hvdyB5b3UgdGhlIGJhc2ljIGNvbmNlcHRzIG9mIHBsb3R0aW5nIHVzaW5nIHRoZSBpbnRlcmFjdGl2ZSBwYWNrYWdlIGR5Z3JhcGhzLg0KDQojIyMjIFlvdSBtYXkgbmVlZCB0byBzZXQgeW91ciB3b3JraW5nIGRpcmVjdG9yeToNCmBgYHtyfQ0Kc2V0d2QoIlo6L3JlcG9zL2thdHNtaS9TdGF0c19SX1Zpc3VhbGlzYXRpb24vIikNCmBgYA0KIyMjIyBsb2FkIGluIHBhY2thZ2VzDQpgYGB7cn0NCmluc3RhbGwucGFja2FnZXMoImR5Z3JhcGhzIikNCmxpYnJhcnkoZHlncmFwaHMpDQppbnN0YWxsLnBhY2thZ2VzKCJ4dHMiKQ0KbGlicmFyeSh4dHMpDQppbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpDQpsaWJyYXJ5KGRwbHlyKQ0KYGBgDQojIyMjIHJlYWQgaW4gc29tZSBmbG93IGRhdGENCmBgYHtyfQ0KVGhhbWVzX09iczwtcmVhZC5jc3YoIlFvYnNfMzkwMDEuY3N2IikNCmBgYA0KIyMjIyBwcmVwIHRoZSBkYXRhIGZvciBkeWdyYXBocw0KYGBge3J9DQojIGZvcm1hdCBkYXRlIGNvbHVtbg0KVGhhbWVzX09icyREQVRFPC0gYXMuUE9TSVhjdChUaGFtZXNfT2JzJERBVEUsIGZvcm1hdD0iJWQvJW0vJVkiKQ0KIyBjb252ZXJ0IHRvIHh0cyBmb3JtYXQgKGNydWNpYWwgIHN0ZXAhKQ0KVGhhbWVzX09ic194dHM8LWFzLnh0cyhUaGFtZXNfT2JzLCBvcmRlci5ieT1UaGFtZXNfT2JzJERBVEUpDQpgYGANCiMjIyMgcGxvdCBhIGR5Z3JhcGgNCmBgYHtyfQ0KZHlncmFwaChUaGFtZXNfT2JzX3h0cyklPiUNCiAgZHlPcHRpb25zKCklPiUNCiAgZHlSYW5nZVNlbGVjdG9yKCkNCmBgYA0KIyMjIyBwbG90IG9ic2VydmVkIHN0cmVhbWZsb3cgd2l0aCB0aGUgcHJlY2lwaXRhdGlvbiBkYXRhLCB3aXRoIGRpZmZlcmVudCB5IGF4ZXMNCmBgYHtyfQ0KIyByZWFkIGluIHByZWNpcGl0YXRpb24gZGF0YQ0KVGhhbWVzX3ByZWNpcCA8LSByZWFkLmNzdigiTU9fZGFpbHlfcmFpbl8xODkxXzIwMTVfMzkwMDEuY3N2IikNClRoYW1lc19wcmVjaXAkREFURTwtYXMuUE9TSVhjdChUaGFtZXNfcHJlY2lwJERBVEUsIGZvcm1hdD0iJVktJW0tJWQiKQ0KIyBtZXJnZSB0aGUgZGF0YQ0KVGhhbWVzX2RhdGE8LWZ1bGxfam9pbihUaGFtZXNfT2JzLFRoYW1lc19wcmVjaXAsYnk9IkRBVEUiKQ0KIyAgY29udmVydCB0aGUgb2JzZXJ2ZWQgZGlzY2hhcmdlIHRvIHJ1bm9mZiAoc28gaXRzIGluIHRoZSBzYW1lIHVuaXRzIGFzIHRoZSBwcmVjaXApDQojIGRpdmlkZSBieSBjYXRjaG1lbnQgYXJlYSAobTIpIGFuZCBtdWxpdHBseSBieSA4Ni40DQpUaGFtZXNfZGF0YSRSdW5vZmYgPC0gKFRoYW1lc19kYXRhJFFvYnMvOTk0OC4wKSo4Ni40DQojIGNvbnZlcnQgdG8geHRzIC0gbm90ZSB0aGF0IEkgYW0gbGVhdmluZyBvdXQgdGhlIERhdGUgY29sdW1uIGZyb20gdGhlIHh0cyBkYXRhc2V0LiBXaGVuIGdpdmVuIG11bHRpcGxlIHNlcmllcyBpdCBvZnRlbiBsaWtlcyB0byBwbG90IHRoZSBkYXRlIGNvbHVtbiB0b28gd2hpY2ggaXMgYSBwYWluIQ0KVGhhbWVzX2RhdGFfeHRzIDwtIGFzLnh0cyhUaGFtZXNfZGF0YVssMzo0XSwgb3JkZXIuYnk9VGhhbWVzX2RhdGEkREFURSkNCiMgaW5pdGlhdGUgdGhlIGR5Z3JhcGgNCmR5Z3JhcGgoVGhhbWVzX2RhdGFfeHRzLCBtYWluID0gIlJ1bm9mZiBhbmQgUHJlY2lwaXRhdGlvbiBPYnNlcnZhdGlvbnMgZm9yIHRoZSBUaGFtZXMgYXQgS2luZ3N0b24iKSU+JQ0KIyBkZWZpbmUgdGhlIGZpcnN0IGF4aXMgIA0KZHlBeGlzKG5hbWUgPSAieSIsIGxhYmVsID0gInJ1bm9mZiAobW0vZGF5KSIsDQogICAgICAgdmFsdWVSYW5nZSA9IHJhbmdlKFRoYW1lc19kYXRhX3h0c1ssICJSdW5vZmYiXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSogYygwLjAxLCAxLjU5KSklPiUNCiMgZGVmaW5lIHRoZSBzZWNvbmQgYXhpcw0KZHlBeGlzKG5hbWUgPSAieTIiLCBsYWJlbCA9ICJwcmVjaXAgKG1tL2RheSkiLA0KICAgICAgICAgICAgICAgICAgIHZhbHVlUmFuZ2UgPSByZXYocmFuZ2UoVGhhbWVzX2RhdGFfeHRzWywgIk1lYW5fcmFpbmZhbGwiXSwgDQogICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSogYygwLjAxLCAyLjk5KSkpJT4lDQojIHBsb3QgdGhlIGRhdGENCmR5U2VyaWVzKCJSdW5vZmYiLGF4aXMgPSAneScpJT4lDQpkeVNlcmllcygiTWVhbl9yYWluZmFsbCIsIGF4aXMgPSAneTInLCBzdGVwUGxvdCA9IFRSVUUsDQogICAgICAgICBmaWxsR3JhcGggPSBUUlVFKSU+JQ0KZHlPcHRpb25zKGNvbG9ycyA9IFJDb2xvckJyZXdlcjo6YnJld2VyLnBhbCgzLCJTZXQxIilbMzoxXSkgJT4lDQpkeVJhbmdlU2VsZWN0b3IoKQ0KYGBgDQojIyMjIHBsb3QgYW4gdXBwZXIgYW5kIGxvd2VyIGxpbWl0IG9uIGEgc2VyaWVzDQpgYGB7cn0NCiNyZWFkIGluIHNvbWUgbW9kZWxsZWQgZGF0YQ0KVGhhbWVzX1FzaW0gPC0gcmVhZC5jc3YoIkhEX1JlY29uc3RydWN0aW9uXzM5MDAxLmNzdiIpDQpUaGFtZXNfUXNpbSREYXRlPC1hcy5QT1NJWGN0KFRoYW1lc19Rc2ltJERhdGUsZm9ybWF0PSIlWS0lbS0lZCIpDQojcmVvcmRlciBzbyB0aGUgbG93ZXIsIG1pZGRsZSBhbmQgdXBwZXIgY29sdW1ucyBhcmUgY29ycmVjdGx5IHBsYWNlZA0KVGhhbWVzX1FzaW08LVRoYW1lc19Rc2ltWyxjKDIsNCwzLDUpXQ0KVGhhbWVzX1FzaW1feHRzPC1hcy54dHMoVGhhbWVzX1FzaW1bLDI6NF0sb3JkZXIuYnk9VGhhbWVzX1FzaW0kRGF0ZSkNCmR5Z3JhcGgoVGhhbWVzX1FzaW1feHRzLCBtYWluPXBhc3RlMCgiUmVjb25zdHVjdGVkIEZsb3cgVGltZSBTZXJpZXMgZm9yIHRoZSBUaGFtZXMgYXQgS2luZ3N0b24iKSkgJT4lDQogIGR5U2VyaWVzKGMoIk1pbl81MDAiLCJGbG93X1RvcF9DYWxpYiIsIk1heF81MDAiKSklPiUNCiAgZHlBeGlzKCJ5IiwgbGFiZWwgPSAiRmxvdyAobTMvcykiKSU+JQ0KICBkeU9wdGlvbnMoZmlsbEFscGhhPTAuNSkgJT4lDQogIGR5UmFuZ2VTZWxlY3RvcihoZWlnaHQ9MTApDQpgYGANCiMjIyMgcGxvdCB0aGUgb2JzZXJ2YXRpb25zIHRvbyBmb3IgY29tcGFyaXNvbg0KYGBge3J9DQpjb2xuYW1lcyhUaGFtZXNfUXNpbSk8LWMoIkRBVEUiLCJNaW5fNTAwIiwiRmxvd19Ub3BfQ2FsaWIiLCJNYXhfNTAwIikNClRoYW1lc19jb21wPC1mdWxsX2pvaW4oVGhhbWVzX1FzaW0sVGhhbWVzX09icyxieT0iREFURSIpDQpUaGFtZXNfY29tcF94dHM8LWFzLnh0cyhUaGFtZXNfY29tcFssMjo1XSxvcmRlci5ieT1UaGFtZXNfY29tcCREQVRFKQ0KZHlncmFwaChUaGFtZXNfY29tcF94dHMsIG1haW49cGFzdGUwKCJSZWNvbnN0dWN0ZWQgYW5kIE9ic2VydmVkIEZsb3cgVGltZSBTZXJpZXMgZm9yIHRoZSBUaGFtZXMgYXQgS2luZ3N0b24iKSkgJT4lDQogIGR5U2VyaWVzKGMoIk1pbl81MDAiLCJGbG93X1RvcF9DYWxpYiIsIk1heF81MDAiKSklPiUNCiAgZHlTZXJpZXMoIlFvYnMiKSU+JQ0KICBkeUF4aXMoInkiLCBsYWJlbCA9ICJGbG93IChtMy9zKSIpJT4lDQogIGR5T3B0aW9ucyhmaWxsQWxwaGE9MC41KSAlPiUNCiAgZHlSYW5nZVNlbGVjdG9yKGhlaWdodD0xMCkNCmBgYA0K